﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AgileSaude.Entities;
using AgileSaude.Data;
using AgileSaude.Data.Repository;
using FBS.Framework;
using AgileSaude.Business.Validation;

namespace AgileSaude.Business.Process
{
    internal class Servico_MedicoProcess
    {
        internal Resultado Incluir(Servico_MedicoEntities pObj)
        {
            Resultado resultado = new Resultado();

            try
            {
                Servico_MedicoValidation userValid = new Servico_MedicoValidation(pObj);
                resultado = userValid.ValidarServico_Medico();

                if (resultado.Sucesso)
                {
                    servico_medico obj = new servico_medico();
                    Util.CopyPropertyValues(pObj, obj);

                    new servico_medicoRepository().Add(obj);
                }
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Incluir", "Servico_MedicoProcess");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Alterar(Servico_MedicoEntities pObj)
        {
            Resultado resultado = new Resultado();
            servico_medicoRepository Servico_MedicoRepository = new servico_medicoRepository();

            try
            {
                servico_medico user = Servico_MedicoRepository.getservico_medico(pObj.idServico_medico);
                Util.CopyPropertyValues(pObj, user);

                Servico_MedicoRepository.Update();
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Deletar(Servico_MedicoEntities pObj)
        {
            Resultado resultado = new Resultado();
            servico_medicoRepository Servico_MedicoRepository = new servico_medicoRepository();

            try
            {
                servico_medico obj = Servico_MedicoRepository.getservico_medico(pObj.idServico_medico);
                Util.CopyPropertyValues(pObj, obj);

                Servico_MedicoRepository.Delete(obj);
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Servico_MedicoEntities GetServico_Medico(int pIdServico_Medico)
        {
            servico_medico oData = new servico_medicoRepository().getservico_medico(pIdServico_Medico);

            if (oData == null)
            {
                return new Servico_MedicoEntities();
            }
            else
            {
                return GetServico_Medico(oData);
            }

        }

        internal Servico_MedicoEntities GetServico_Medico(int pIdServico, int pIdMedico)
        {
            servico_medico oData = new servico_medicoRepository().getservico_medico(pIdServico, pIdMedico);

            if (oData != null)
            {
                return GetServico_Medico(oData);
            }
            else
            {
                return null;
            }

        }

        private static Servico_MedicoEntities GetServico_Medico(servico_medico oData)
        {
            Servico_MedicoEntities oEntitie = new Servico_MedicoEntities();

            Util.CopyPropertyValues(oData, oEntitie);

            MedicoEntities med = new MedicoProcess().GetMedico(oEntitie.idMedico);
            if (med != null)
                oEntitie.NomeMedico = med.Nome;

            ServicoEntities serv = new ServicoProcess().GetServico(oEntitie.idServico);
            if (serv != null)
            {
                oEntitie.NomeServico = serv.Nome;
                oEntitie.DescrServico = serv.Descricao;
            }
            return oEntitie;
        }

        internal List<Servico_MedicoEntities> Listar(Servico_MedicoEntities pFiltro, ref Resultado resultado)
        {
            List<Servico_MedicoEntities> lista = new List<Servico_MedicoEntities>();

            if (pFiltro == null)
            {
                pFiltro = new Servico_MedicoEntities();
            }

            try
            {
                var Servico_Medico = from u in new servico_medicoRepository().GetAll()
                                     where (pFiltro.idServico == 0 || u.idServico == pFiltro.idServico) &&
                              (pFiltro.idMedico == 0 || u.idMedico == pFiltro.idMedico)
                             select u;

                foreach (servico_medico user in Servico_Medico)
                {
                    lista.Add(GetServico_Medico(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "Servico_MedicoProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }
    }
}
